

package modelos;

import java.lang.String;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

public class MProducto {

    private String codigo,descripcion,cod_categoria,status;
    private float precio;
    private MConexion conexion;

    public MProducto(){
            super();
            conexion= new MConexion();
    }

    public boolean registrarProducto(){
        conexion.conectar();
        boolean sw = false;       
        try {
            conexion.getConexion().createStatement().execute("INSERT INTO Producto (codigo, codigo_cat, descripcion, precio , status ) VALUES('"+getCodigo()+"','"+getCod_categoria()+"','"+getDescripcion()+"',"+getPrecio()+",'A')");
            sw= true;
        } catch (SQLException ex) {
             sw= false;
        }
        conexion.desconectar();
        return sw;
    }
    

    public void registrarIngredientes(ArrayList<String> codigos,ArrayList<Float> cantidades){
        conexion.conectar();
        for (int i = 0; i < cantidades.size(); i++){
            try {
                conexion.getConexion().createStatement().execute("INSERT INTO IngredienteXProducto (codigo_pro,codigo_ing, cantidad) VALUES('"+getCodigo()+"','"+codigos.get(i)+"',"+cantidades.get(i)+")");
            } catch (SQLException ex) {
                Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
            }
        }        
        conexion.desconectar();
    }


  public ArrayList<MProducto> listarProductos(){
    ArrayList<MProducto> v = new ArrayList<MProducto>();
    conexion.conectar();
    try {
        ResultSet rs =conexion.getConexion().createStatement().executeQuery("SELECT * FROM Producto WHERE status='A'");
        while (rs.next()){
            MProducto  i = new MProducto();
            i.setDescripcion(rs.getString("descripcion"));
            i.setCodigo(rs.getString("codigo"));
            i.setPrecio(rs.getFloat("precio"));
            i.setStatus(rs.getString("status"));
            i.setCod_categoria(rs.getString("codigo_cat"));
            v.add(i);
         }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public ArrayList<String []> ingredientesUsados(boolean ascesdente,boolean descesdente){
    ArrayList<String []> v = new ArrayList<String []>();
    conexion.conectar();
    try {
        ResultSet rs=null;
        if(ascesdente)
            rs =conexion.getConexion().createStatement().executeQuery("SELECT suma , descripcion , codigo FROM  Ingrediente,(SELECT SUM(cantidad) AS suma,codigo_ing AS cod FROM IngredienteXProducto GROUP BY codigo_ing) Suma WHERE Ingrediente.codigo=Suma.cod ORDER BY suma ASC");
        if(descesdente)
            rs =conexion.getConexion().createStatement().executeQuery("SELECT suma , descripcion , codigo FROM  Ingrediente,(SELECT SUM(cantidad) AS suma,codigo_ing AS cod FROM IngredienteXProducto GROUP BY codigo_ing) Suma WHERE Ingrediente.codigo=Suma.cod ORDER BY suma DESC");
        while (rs.next()){
            String [] s = new String [] {rs.getString(2), ""+rs.getFloat(1), ""+rs.getString(3)};
            v.add(s);
        }
  } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

  public ArrayList<String []> listarIngredientes(){
    ArrayList<String []> v = new ArrayList<String []>();
    conexion.conectar();
    try {
        ResultSet rs =conexion.getConexion().createStatement().executeQuery("SELECT Ingrediente.descripcion, IngredientexProducto.cantidad  FROM Ingrediente, Producto,IngredientexProducto where Ingrediente.status='A' AND Producto.status='A' AND Producto.codigo=IngredientexProducto.codigo_pro AND Ingrediente.codigo=IngredientexProducto.codigo_ing AND Producto.codigo='"+getCodigo()+"'");
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getFloat(2)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }
  
  public ArrayList<String []> listarVentas(boolean ascesdente,boolean descesdente){
    ArrayList<String []> v = new ArrayList<String []>();conexion.conectar();
    try{
        ResultSet rs=null;
        if(ascesdente)
            rs =conexion.getConexion().createStatement().executeQuery("SELECT descripcion, (precio*total.cantidad), total.cantidad, codigo FROM  Producto, (SELECT sum(IngredientexProducto.cantidad) as cantidad, IngredientexProducto.codigo_pro AS cod FROM IngredientexProducto GROUP BY IngredientexProducto.codigo_pro) total WHERE total.cod=codigo AND status='A' ORDER BY(total.cantidad,(precio*total.cantidad)) ASC");
        if(descesdente)
            rs =conexion.getConexion().createStatement().executeQuery("SELECT descripcion, (precio*total.cantidad), total.cantidad, codigo FROM  Producto, (SELECT sum(IngredientexProducto.cantidad) as cantidad, IngredientexProducto.codigo_pro AS cod FROM IngredientexProducto GROUP BY IngredientexProducto.codigo_pro) total WHERE total.cod=codigo AND status='A' ORDER BY(total.cantidad,(precio*total.cantidad)) DESC");
        while (rs.next()){
            String [] s = new String [] {rs.getString(1), ""+rs.getFloat(2), ""+rs.getInt(3), ""+rs.getString(4)};
            v.add(s);
        }
    } catch (SQLException ex) {
        Logger.getLogger(MProducto.class.getName()).log(Level.SEVERE, null, ex);
    }
    return v;
  }

   public boolean stockIngredientes(){
    ArrayList<MIngrediente> v = new ArrayList<MIngrediente>();
    ArrayList<Float> f = new ArrayList<Float>();
    conexion.conectar();
    try{
        ResultSet rs =conexion.getConexion().createStatement().executeQuery("SELECT Ingrediente.codigo,IngredientexProducto.cantidad FROM  Ingrediente,IngredientexProducto,Producto WHERE Ingrediente.status='A'  AND Producto.status='A' AND Ingrediente.codigo=IngredientexProducto.codigo_ing AND Producto.codigo=IngredientexProducto.codigo_pro AND Producto.codigo='"+getCodigo()+"'");
        while(rs.next()){
            MIngrediente  i = new MIngrediente();
            i.setCodigo(rs.getString(1));
            f.add(rs.getFloat(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(MIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     conexion.desconectar();
     for (int i = 0; i < v.size(); i++){
         if(!(v.get(i).disponible(f.get(i)))){
             return false;
         }
     }
     return true;
  }

 public void actualizarStockIngredientes(){
    ArrayList<MIngrediente> v = new ArrayList<MIngrediente>();
    ArrayList<Float> f = new ArrayList<Float>();
    conexion.conectar();
    try{
        ResultSet rs =conexion.getConexion().createStatement().executeQuery("SELECT Ingrediente.codigo,IngredientexProducto.cantidad FROM  Ingrediente,IngredientexProducto,Producto WHERE Ingrediente.status='A'  AND Producto.status='A' AND Ingrediente.codigo=IngredientexProducto.codigo_ing AND Producto.codigo=IngredientexProducto.codigo_pro AND Producto.codigo='"+getCodigo()+"'");
        while(rs.next()){
            MIngrediente  i = new MIngrediente();
            i.setCodigo(rs.getString(1));
            f.add(rs.getFloat(2));
            v.add(i);
         }
     } catch (SQLException ex) {
            Logger.getLogger(MIngrediente.class.getName()).log(Level.SEVERE, null, ex);
     }
     conexion.desconectar();
     for (int i = 0; i < v.size(); i++){
         v.get(i).consultar();
         v.get(i).setStock(v.get(i).getStock()-f.get(i));
         v.get(i).restarStock();
     }
  }

    public String getCod_categoria() {
        return cod_categoria;
    }

    public void setCod_categoria(String cod_categoria) {
        this.cod_categoria = cod_categoria;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getDescripcion() {
        return descripcion;
    }

    public void setDescripcion(String descripcion) {
        this.descripcion = descripcion;
    }

    public float getPrecio() {
        return precio;
    }

    public void setPrecio(float precio) {
        this.precio = precio;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }
}
